Ext.namespace("Hroze");
/**
 * 下拉列表工具类
 */
Hroze.Select = function() {
	return {
		/**
		 * @param {HTMLElement}
		 *            select 下拉列表
		 * @description 下拉列表上移
		 */
		up : function(select) {
			if (Ext.isString(select)) {
				select = Ext.getDom(select);
			}
			var obj = select.getElementsByTagName('option');
			var idx, tmpText, tmpValue;
			idx = select.selectedIndex;
			if (idx > 0) {
				tmpText = obj[idx].text;
				tmpValue = obj[idx].value;
				obj[idx].text = obj[idx - 1].text;
				obj[idx].value = obj[idx - 1].value;
				obj[idx - 1].text = tmpText;
				obj[idx - 1].value = tmpValue;
				select.selectedIndex = idx - 1;
			}
		},
		/**
		 * @param {HTMLElement/String}
		 *            select 下拉列表
		 * @description 下拉列表选中位置下移
		 */
		down : function(select) {
			if (Ext.isString(select)) {
				select = Ext.getDom(select);
			}
			var obj = select.getElementsByTagName('option');
			var len, idx, tmpText, tmpValue;
			len = obj.length;
			idx = select.selectedIndex;
			if ((idx >= 0) && (idx < len - 1)) {
				tmpText = obj[idx].text;
				tmpValue = obj[idx].value;
				obj[idx].text = obj[idx + 1].text;
				obj[idx].value = obj[idx + 1].value;
				obj[idx + 1].text = tmpText;
				obj[idx + 1].value = tmpValue;
				select.selectedIndex = idx + 1;
			}
		},
		/**
		 * @description 获得指定值对应的文本
		 * @param {HTMLElement/String} select 下拉列表节点
		 * @param {String} value 选项的值
		 */
		getTextByValue : function(select, value) {
			if (Ext.isString(select)) {
				select = Ext.getDom(select);
			}
			var obj = select.getElementsByTagName('option');
			var len, text = '';
			len = obj.length;
			for (var i = 0; i < len; i++) {
				if (obj[i].value == value) {
					text = obj[i].text;
				}
			}
			return text;

		},
		/**
		 * @param {HTMLElement/String} select 下拉列表
		 * @description 获得当前排列顺序
		 * @return {array} 顺序数组
		 */
		getOrder : function(select) {
			if (Ext.isString(select)) {
				select = Ext.getDom(select);
			}
			var obj = select.getElementsByTagName('option');
			var len, idx, tmpText, tmpValue;
			len = obj.length;
			var order = [];
			for (var i = 0; i < len; i++) {
				order.push(obj[i].value);
			}
			return order;

		},
		/**
		 * @param {HTMLElement/String}  select 下拉列表
		 * @param {array}        order value的顺序数组
		 * @description 设置选项顺序
		 */
		setOrder : function(select, order) {
			if (Ext.isString(select)) {
				select = Ext.getDom(select);
			}
			var obj = select.getElementsByTagName('option');
			var len, idx, tmpText, tmpValue;
			len = obj.length;
			for (var i = 0; i < order.length && i < len; i++) {
				var opt = Hroze.Select.getOptionByValue(select, order[i]);
				if (opt) {
					console.info(opt, obj[i]);
					tmpText = obj[i].text;
					temValue = obj[i].value;
					obj[i].text = opt.text;
					obj[i].value = opt.value;
					opt.text = tmpText;
					opt.value = tmpValue;
				}
			}

		},
		/**
		 * @param {HTMLElement/String} select 下拉列表
		 * @param {array} values 列表的值
		 * @param {array}  texts 列表的名称
		 * @description 设置下拉列表的选项
		 */
		setOptions : function(select, values, texts) {
			if (Ext.isString(select)) {
				select = Ext.getDom(select);
			}
			Hroze.Select.removeAll(select);
			Hroze.util.emptyFn.defer(1000);
			for (var i = 0; i < values.length && i < texts.length; i++) {
				Hroze.Select.addOption(select, values[i], texts[i]);
			}
		},
		/**
		 * 使用配置列表生成下拉列表项
		 * 
		 * @param {HTMLElement/String}  select 元素
		 * @param {array} data 数据数组
		 * @param {object} cfg 配置选项，如果不填默认为{value:"value",text:"text"}
		 * @param {boolean} reserve 是否保留原有项默认false
		 */
		applyOptions : function(select, data, cfg, reserve) {
			if (Ext.isString(select)) {
				select = Ext.getDom(select);
			}
			if (!reserve) {
				Hroze.Select.removeAll(select);
			}
			Hroze.util.emptyFn.defer(1000);
			if (Ext.isArray(data)) {
				cfg = cfg ? cfg : {
					value : "value",
					text : "text"
				};
				Ext.each(data, function(item, index, arr) {
							Hroze.Select.addOption(select, item[cfg.value],
									item[cfg.text]);
						});

			}
		},
		/**
		 * 使用vlaue属性取得值OPTION 元素
		 * @param {HTMLElement} select 下拉列表
		 * @param {String} value 值
		 * @return {HTMLElement} 选项
		 */
		getOptionByValue : function(select, value) {
			var opt;
			if (Ext.isString(select)) {
				select = Ext.getDom(select);
			}
			var obj = select.getElementsByTagName('option');
			var len;
			len = obj.length;
			for (var i = 0; i < len; i++) {
				if (obj[i].value == value) {
					return obj[i];
				}
			}
			return opt;
		},
		/**
		 * @description 设置选中项
		 * @param {HTMLElement/String} select 下拉列表
		 * @param {string} value  要选中的值
		 */
		setSelect : function(select, value) {
			var opt;
			if (Ext.isString(select)) {
				select = Ext.getDom(select);
			}
			var obj = select.getElementsByTagName('option');
			var len;
			len = obj.length;
			for (var i = 0; i < len; i++) {
				if (obj[i].value == value) {
					select.selectedIndex = i;
					break;
				}
			}

		},
		/**
		 * @description 增加新选项
		 * @param {HTMLElement/String}  select 下拉列表
		 * @param {string} value 值
		 * @param {string} text  显示值
		 */
		addOption : function(select, value, text) {
			if (Ext.isString(select)) {
				select = Ext.getDom(select);
			}
			var op = document.createElement('option');
			op.value = value;
			op.text = text;
			try {
				if (select != null) {
					select.add(op, null);
				}
			} catch (ex) {
				select.add(op); // IE only
			}
		},
		/**
		 * @description 删除所有选项
		 * @param {HTMLElement/String} select
		 */
		removeAll : function(select) {
			if (Ext.isString(select)) {
				select = Ext.getDom(select);
			}
			var obj = select.getElementsByTagName('option');
			for (var i = obj.length - 1; i >= 0; i--) {
				select.remove(i);
			}
			// 防止删除不干净
			if (select.getElementsByTagName('option').length > 0) {
				this.removeAll(select);
			};
		},
		/**
		 * 增加树形选项
		 * @param {HTMLElement} el
		 * @param {array} data 构造数据
		 * @param {number} deep 深度
		 *            @example
		 *            所有
		 * 			 |-第一个
		 * 			 |-第二个
		 * 			 |  |-第二个的第一个
		 * 			 |
		 */
		addChild : function(el, data, deep) {
			if (!Ext.isArray(data) || data.length < 1) {
				return;
			}
			// 深度从零开始
			if (Ext.isEmpty(deep)) {
				deep = 0;
			}
			Ext.each(data, function(item) {
						// 使用原生API
						Hroze.Select.addOption(el, item.id,
								Hroze.Select.getNodeText(item.text, deep));
						// tpl在IE中不能用
						/*
						 * tpl.append(el,{value:item.id,text:Hroze.Select.getNodeText(item.text,deep)});
						 */
						if (Ext.isArray(item.child)) {
							Hroze.Select.addChild(el, item.child, deep + 1);
						}
					});
		},
		/**
		 * 生成显示文本
		 */
		getNodeText : function(text, deep) {
			if (deep == 0) {
				return text;
			} else if (deep == 1) {
				return " |-" + text;
			} else if (deep > 1) {
				var t;
				for (var i = 0; i < deep - 1; i++) {
					t += " | ";
				}
				return t + " |-";
			} else {
				return text;
			}
		}
	}
}()
